﻿// The MIT License (MIT)
//
// Copyright (c) 2015 FramTack, LLC
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), 
// to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
// DEALINGS IN THE SOFTWARE.
//
// For more information visit the project home page at http://solutionfamily.codeplex.com or the owner's site at http://solution-family.com
//

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Net;
using System.Diagnostics;
using OpenNETCF;

namespace SolutionFamily.IO.Simma
{
    public class SimmaCAN : IJ1939Bus
    {
        public event EventHandler<GenericEventArgs<J1939ReceiveMessage>> MessageReceived;

        private VNA232 m_vna;
        private int m_port;

        internal SimmaCAN(VNA232 parent, int portNumber)
        {
            m_port = portNumber;
            m_vna = parent;
        }

        internal void RaiseMessageReceived(J1939ReceiveMessage message)
        {
            MessageReceived.Fire(this, new GenericEventArgs<J1939ReceiveMessage>(message));
        }

        public void Subscribe(int pgn)
        {
            var addFilterMessage = new J1939AcceptanceFilterAdd(m_port, pgn);
            m_vna.Send(addFilterMessage.Serialize());
        }

        public void RequestPGN(int source, int address, int pgn)
        {
            var m = new J1939TransmitMessage()
            {
                DestinationAddress = address,
                Priority = 1,
                SourceAddress = source,
                PGN = 59904,
            };

            m.Data = new byte[3];

            // PGN is 3 bytes, MSB first
            m.Data[0] = (byte)((pgn & 0x00FF0000) >> 16); // pgn MSB
            m.Data[1] = (byte)((pgn & 0x0000FF00) >> 8);
            m.Data[2] = (byte)(pgn & 0x000000FF); // pgn LSB


            Send(m);
        }

        public void PeriodicSend(J1939TransmitMessage message)
        {
            var msg = new J1939Px(m_port, message);
            m_vna.Send(msg.Serialize());
        }

        public void Send(J1939TransmitMessage message)
        {
            var msg = new J1939Tx(m_port, message);
            m_vna.Send(msg.Serialize());
        }

        public void Unsubscribe(int pgn)
        {
            throw new NotImplementedException();
        }
    }
}
